package cn.iocoder.yudao.module.mqtt.service.mqtt;

import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.mqtt.controller.admin.config.vo.ConfigPageReqVO;
import cn.iocoder.yudao.module.mqtt.dal.dataobject.config.MqttConfig2DO;
import cn.iocoder.yudao.module.mqtt.dal.dataobject.mqtt.MqttConfigDO;
import cn.iocoder.yudao.module.mqtt.dal.mysql.mqtt.MqttConfigMapper;
import cn.iocoder.yudao.module.mqtt.framework.mqtt.MqttInstanceManager;
import cn.iocoder.yudao.module.mqtt.framework.util.TenantContextUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * MQTT配置服务
 *
 * @author 芋道源码
 */
@Slf4j
@Service
public class MqttConfigServiceImpl implements  MqttConfigService{

    @Autowired
    private MqttConfigMapper mqttConfigMapper;

    @Autowired
    private MqttInstanceManager mqttInstanceManager;

    /**
     * 获取所有启用的MQTT配置
     */
    @Override
    public List<MqttConfigDO> getEnabledConfigs() {
        try {
            return TenantContextUtil.executeWithTenantContext(() -> 
                mqttConfigMapper.selectList(MqttConfigDO::getEnabled, true)
            );
        } catch (Exception e) {
            log.warn("获取启用的MQTT配置失败，返回空列表", e);
            return new java.util.ArrayList<>();
        }
    }

    /**
     * 根据ID获取MQTT配置
     */
    @Override
    public MqttConfigDO getConfigById(Long id) {
        try {
            return TenantContextUtil.executeWithTenantContext(() -> 
                mqttConfigMapper.selectById(id)
            );
        } catch (Exception e) {
            log.error("获取MQTT配置失败，ID: {}", id, e);
            return null;
        }
    }

    /**
     * 创建MQTT配置
     */
    @Override
    public Long createConfig(MqttConfigDO config) {
        try {
            return TenantContextUtil.executeWithTenantContext(() -> {
                mqttConfigMapper.insert(config);

                // 如果配置是启用的，则启动MQTT实例
                if (config.getEnabled()) {
                    mqttInstanceManager.startMqttInstance(config);
                }

                return config.getId();
            });
        } catch (Exception e) {
            log.error("创建MQTT配置失败", e);
            throw e;
        }
    }

    /**
     * 更新MQTT配置
     */
    @Override
    public void updateConfig(MqttConfigDO config) {
        try {
            TenantContextUtil.executeWithTenantContext(() -> {
                // 先停止现有实例
                if (mqttInstanceManager.isInstanceRunning(config.getId())) {
                    mqttInstanceManager.stopMqttInstance(config.getId());
                }
                
                // 更新配置
                mqttConfigMapper.updateById(config);
                
                // 如果配置是启用的，则重新启动MQTT实例
                if (config.getEnabled()) {
                    mqttInstanceManager.startMqttInstance(config);
                }
            });
        } catch (Exception e) {
            log.error("更新MQTT配置失败", e);
            throw e;
        }
    }

    /**
     * 删除MQTT配置
     */
    @Override
    public void deleteConfig(Long id) {
        try {
            TenantContextUtil.executeWithTenantContext(() -> {
                // 先停止实例
                if (mqttInstanceManager.isInstanceRunning(id)) {
                    mqttInstanceManager.stopMqttInstance(id);
                }
                
                // 删除配置
                mqttConfigMapper.deleteById(id);
            });
        } catch (Exception e) {
            log.error("删除MQTT配置失败，ID: {}", id, e);
            throw e;
        }
    }

    /**
     * 启动MQTT实例
     */
    @Override
    public void startInstance(Long configId) {
        MqttConfigDO config = getConfigById(configId);
        if (config != null && config.getEnabled()) {
            mqttInstanceManager.startMqttInstance(config);
        }
    }

    /**
     * 停止MQTT实例
     */
    @Override
    public void stopInstance(Long configId) {
        mqttInstanceManager.stopMqttInstance(configId);
    }

    /**
     * 获取实例运行状态
     */
    @Override
    public boolean isInstanceRunning(Long configId) {
        return mqttInstanceManager.isInstanceRunning(configId);
    }

    /**
     * 初始化所有启用的MQTT实例
     */
    @Override
    public void initAllEnabledInstances() {
        try {
            List<MqttConfigDO> enabledConfigs = getEnabledConfigs();
            for (int i = 0; i < enabledConfigs.size(); i++){
                log.info("找到 {} 个启用的MQTT配置 : {}", enabledConfigs.size(), enabledConfigs.get(i).getName());
            }

            for (MqttConfigDO config : enabledConfigs) {
                try {
                    if (config.getId() != null && config.getEnabled()) {
                        mqttInstanceManager.startMqttInstance(config);
                        log.info("MQTT实例初始化成功，配置ID: {}, 名称: {}", config.getId(), config.getName());
                    } else {
                        log.warn("跳过无效的MQTT配置，配置ID: {}, 名称: {}", config.getId(), config.getName());
                    }
                } catch (Exception e) {
                    log.error("MQTT实例初始化失败，配置ID: {}, 名称: {}", config.getId(), config.getName(), e);
                }
            }
        } catch (Exception e) {
            log.error("初始化MQTT实例时发生异常", e);
        }
    }

    @Override
    public PageResult<MqttConfigDO> getConfigPage(ConfigPageReqVO pageReqVO) {
        return mqttConfigMapper.selectPage(pageReqVO);
    }

} 